home *** CD-ROM | disk | FTP | other *** search
/ EuroCD 3 / EuroCD 3.iso / Programming / Python-1.4 / Demo / classes / Rev.py < prev    next >
Text File  |  1998-06-24  |  2KB  |  90 lines

  1. # A class which presents the reverse of a sequence without duplicating it.
  2. # From: "Steven D. Majewski" <sdm7g@elvis.med.virginia.edu>
  3.  
  4. # It works on mutable or inmutable sequences.
  5. #
  6. # >>> for c in Rev( 'Hello World!' ) : sys.stdout.write( c )
  7. # ... else: sys.stdout.write( '\n' )
  8. # ... 
  9. # !dlroW olleH
  10. #
  11. # The .forw is so you can use anonymous sequences in __init__, and still
  12. # keep a reference the forward sequence. ) 
  13. # If you give it a non-anonymous mutable sequence, the reverse sequence
  14. # will track the updated values. ( but not reassignment! - another 
  15. # good reason to use anonymous values in creating the sequence to avoid
  16. # confusion. Maybe it should be change to copy input sequence to break
  17. # the connection completely ? )
  18. #
  19. # >>> nnn = range( 0, 3 )
  20. # >>> rnn = Rev( nnn )
  21. # >>> for n in rnn: print n
  22. # ... 
  23. # 2
  24. # 1
  25. # 0
  26. # >>> for n in range( 4, 6 ): nnn.append( n )    # update nnn
  27. # ... 
  28. # >>> for n in rnn: print n    # prints reversed updated values
  29. # ... 
  30. # 5
  31. # 4
  32. # 2
  33. # 1
  34. # 0
  35. # >>> nnn = nnn[1:-1]
  36. # >>> nnn
  37. # [1, 2, 4]
  38. # >>> for n in rnn: print n    # prints reversed values of old nnn
  39. # ... 
  40. # 5
  41. # 4
  42. # 2
  43. # 1
  44. # 0
  45. # >>> 
  46. #
  47. # WH = Rev( 'Hello World!' )
  48. # print WH.forw, WH.back
  49. # nnn = Rev( range( 1, 10 ) )
  50. # print nnn.forw
  51. # print nnn
  52. # produces output:
  53. # Hello World! !dlroW olleH
  54. # [1, 2, 3, 4, 5, 6, 7, 8, 9]
  55. # [9, 8, 7, 6, 5, 4, 3, 2, 1]
  56. # >>>rrr = Rev( nnn ) 
  57. # >>>rrr
  58. # <1, 2, 3, 4, 5, 6, 7, 8, 9>    
  59.  
  60. from string import joinfields
  61. class Rev:
  62.     def __init__( self, seq ):
  63.         self.forw = seq
  64.         self.back = self
  65.     def __len__( self ):
  66.         return len( self.forw )
  67.     def __getitem__( self, j ):
  68.         return self.forw[ -( j + 1 ) ]
  69.     def __repr__( self ):
  70.         seq = self.forw
  71.         if type(seq) == type( [] ) : 
  72.             wrap = '[]'
  73.             sep = ', '
  74.         elif type(seq) == type( () ) : 
  75.             wrap = '()'
  76.             sep = ', '
  77.         elif type(seq) == type( '' ) : 
  78.             wrap = ''
  79.             sep = ''
  80.         else: 
  81.             wrap = '<>'
  82.             sep = ', ' 
  83.         outstrs = []
  84.         for item in self.back :
  85.             outstrs.append( str( item ) )
  86.         return wrap[:1] + joinfields( outstrs, sep ) + wrap[-1:]
  87.